package com.lagou.mr.wc;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    int sum;
    IntWritable value = new IntWritable();

    /**
     *假设map方法输出：hello 1;hello 1;hello 1
     * reduce方法入参中的key和values是什么？
     * key:hello
     * values:<1,1,1>
     * 假设map方法最后输出的是：hello 1; hello 1; hadoop 1; mapreduce 1; hadoop 1;hello 1;
     * reduce方法入参中的key和values又是什么？
     * reduce方法何时调用：map阶段后经过shuffle重排会将一组key相同的kv中的value组成集合，
     * 然后每个集合调用一次reduce方法
     * 如上map输出，重排完会调用三次reduce方法
     * 第一次： key：hello，values:<1,1,1>
     * 第二次： key：hadoop，values:<1,1>
     * 第三次： key：mapreduce，values:<1>
     */

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        sum = 0;
        for (IntWritable count : values) {
            sum += count.get();
        }
        value.set(sum);
        context.write(key,value);
    }
}
